sed

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

sed (від англ. Stream EDitor) — потоковий текстовий редактор (а також мова програмування), що застосовує різні зумовлені текстові перетворення до послідовного потоку текстових даних.

Спочатку був написаний як UNIX-утиліта Лі Макмагоном[en] з Bell Labs в 1973—74 роках. Зараз sed доступний фактично для будь-якої операційної системи, що підтримує роботу з командним рядком.

sed отримує вхідний потік (зазвичай файл), і редагує кожен рядок згідно з правилами, визначеними в sed-скрипті з використанням простої мови sed, і потім виводить результат у вихідний потік.

sed часто називають неінтерактивним текстовим редактором. Він відрізняється від звичайних текстових редакторів «інвертованістю» по відношенню до тексту і набору команд редагування. Звичайні текстові редактори спочатку завантажують весь текст документа, а потім застосовують до нього команди по одній, тоді як sed спочатку завантажує в себе набір команд, а потім застосовує весь набір команд до кожного рядка тексту. Оскільки одночасно в пам'яті знаходиться тільки один рядок, sed може обробити досить великі текстові файли.

Набір команд sed зроблений за зразком редактора ed, проте необхідно пам'ятати про його інвертованість. Наприклад, команда 25d редактора ed означає «йдіть до рядка 25 і видаліть його», тоді як та ж команда sed означає «якщо це рядок з номером 25, то видаліть (не виводьте) його». Відомий виняток — команди копіювання і переміщення, що охоплюють діапазон рядків і таким чином не мають прямих еквівалентів в sed. Натомість, sed вводить додатковий буфер, названий «простором захоплення», і додаткові команди для управління ним. Наприклад команда «Скопіювати рядок 25 в рядок 76» (25t76) в ed була б закодована як дві окремі команди (25h; 76g) в sed для того, щоб зберегти рядок в просторі захоплення доти, поки дані не будуть витягнуті.

Приклад, що демонструє типове використання sed:

sed -e 's/oldstuff/newstuff/g' inputFileName > outputFileName

Тут s — заміна; g — глобально, що означає «у всьому рядку». Після першого прямого слеша розташований регулярний вираз для пошуку, після другого — вираз для заміни. Команда заміни (s///) безумовно є наймогутнішою і часто використовуваною командою sed. Перенаправлення стандартного виводу «> outputFileName» можна опустити, тоді sed виведе результат на екран.

У Unix команда sed часто використовується у вигляді фільтру в конвейєрі (|, або pipe):

generate_data | sed -e 's/x/y/'

Таким чином генеруються дані і передаються на конвейєр, щоб замінити x.

Декілька команд можуть бути об'єднані в одному файлі (наприклад subst.sed) і потім застосовані у вигляді:

sed -f subst.sed inputFileName > outputFileName

Крім заміни, можливі і інші форми простої обробки. Наприклад, наступний сценарій видаляє порожні рядки або рядки, які містять тільки пропуски:

sed -e '/^\s*$/d' inputFileName 

Цей приклад використовує деякі з регулярних виразів-метасимволів:

  • ^ Відповідає початку рядка
  • $ Відповідає кінцю рядка
  • . Відповідає будь-якому єдиному символу
  • \s Відповідає будь-якому пробільному символу (пробіл, табуляція тощо)
  • * Вказує, що попередній символ повторюється 0 (тобто, відсутній у цьому місці), 1 або більше разів
  • [ ] Відповідають одному будь-якому з символів, включених у квадратні дужки [ ]

Складні конструкції sed можливі до такого ступеня, що він може бути представлений як високо спеціалізована, хоч і проста, мова програмування. Потоком управління, зокрема, можна управляти за допомогою мітки (двокрапка, за якою слідує рядок, який має бути ім'ям мітки) і інструкції розгалуження b; інструкція b, за якою слідує правильне ім'я мітки, перемістить обробку в блок після мітки; якщо мітки не існує, тоді розгалуження завершить сценарій (скрипт).

sed — це одна з найбільш ранніх команд Unix, які дозволяли обробляти файли даних з командного рядка. sed розвинувся як природний наступник популярної команди grep. Споріднений пізнішій мові програмування AWK, sed дозволив застосовувати в скриптах ОБОЛОНКИ могутню і цікаву обробку даних, і був одним з перших інструментів Unix, що дійсно заохочував адекватно використовувати регулярні вирази.

sed і awk часто вважаються прародителями і натхненниками мови Perl, і особливо синтаксису «s///» з прикладу вище.

У мови sed немає змінних (не рахуючи області зберігання (holding space), а також нумерованих груп у шаблоні підстановки), є тільки примітив GOTO і функціональні можливості, що виконують розгалуження; проте це повна в смислі Тюринга мова.

GNU sed має декілька нових особливостей, наприклад заміщаючу правку файлів (заміна первинного файлу результатом роботи sed). Заміщаюча правка часто використовується замість сценарію ed, наприклад

sed -i 's/abc/def/' file

може використовуватися замість

ed file
1,$ s/abc/def/
w
q

Існує розширена версія sed, звана Super-sed (ssed), яка включає регулярні вирази, сумісні з Perl.

Посилання

[ред. | ред. код]